/**
 * 
 */
package ictius.menu;

import java.util.Scanner;

import ictius.demonio.Informante;
import ictius.elemenos.Lector;
import ictius.elemenos.Libro;
import ictius.elemenos.Pedido;
import ictius.elemenos.Prestamo;
import ictius.excepciones.ScannerException;
import ictius.herramientas.BuscarElemento;
import java.util.Calendar;
import java.util.Date;

/**
 * Esta clase se encarga de crear los elementos a guardar dentro de las estructuras.
 * Cada método se ocupa de un elemento en particular, por lo que se 
 * instancia a cada elemento dentro del método para tener separada la funcionalidad.
 * @author tadeo 
 */
public class CargaElemento {

    /**
     * Utiliza un objeto Scanner para realizar el ingreso de los datos <i>formateados</i> por teclado.
     */
    private Scanner seguidor = new Scanner(System.in);

    /**
     * Este método se encarga de rellenar los campos del objeto libro.
     */
    public void cargarLibro() throws ScannerException {
        Libro book = new Libro();
        System.out.println("Ingrese el título del libro: ");
        book.setTitulo(seguidor.nextLine());
        System.out.println("Ingrese la cantidad de páginas del libro: ");
        book.setPaginas(leerEnteros(seguidor));
        ControlEstructuras.almacenarLibro(book);
    }

    /**
     * Este método carga la información necesaria para un nuevo Lector.
     */
    public void cargarLector() throws ScannerException {
        Lector lectio = new Lector();
        System.out.println("Ingrese el nombre del lector: ");
        Informante.asustar("Se está creando un nuevo Lector.");
        lectio.setNombre(seguidor.nextLine());
        System.out.println("el apellido: ");
        lectio.setApellido(seguidor.nextLine());
        System.out.println("la dirección: ");
        lectio.setAddress(seguidor.nextLine());
        System.out.println("el teléfono: ");
        lectio.setTelefono(seguidor.nextLine());
        Informante.asustar("Se han cargado los datos necesarios para un nuevo Lector");
        ControlEstructuras.almacenarLector(lectio);
    }

    /**
     * Este método utiliza la búsqueda para completar el campo del Pedido en
     * libro.
     */
    public void cargarPedido() throws ScannerException {
        Pedido neces = new Pedido();
        System.out.println("Ingrese el título del libro que desea pedir: ");
        Informante.asustar("Se está buscando un Libro...");
        neces.setEncargado((Libro) BuscarElemento.buscarLibro(seguidor.nextLine()));
        if (neces.getEncargado() == null) {
            System.out.println("No se puede continuar con el registro del pedido.");
        } else {
            System.out.println("Ingrese el nombre del lector que está pidiendo un libro: ");
            neces.setPretendiente((Lector) BuscarElemento.buscarLector(seguidor.nextLine()));
            if (neces.getPretendiente() == null) {
                System.out.println("No se puede continuar con el registro del pedido.");
            } else {
                Informante.asustar("Se han cargado los datos para realizar el pedido.");
                ControlEstructuras.almacenarPedido(neces);
            }

        }

    }

    /**
     * Este método carga la información necesaria para un nuevo Prestamo. Va a
     * utilizar una búsqueda para regresar con el Lector y el Libro que se
     * quiere llevar.
     */
    public void cargarPrestamo() throws ScannerException {
        Prestamo loan = new Prestamo();
        System.out.println("Ingrese el título del libro que desea");
        Informante.asustar("Se está creando un nuevo Prestamo.");

        loan.setEsteLibro((Libro) BuscarElemento.buscarLibro(seguidor.nextLine()));

        if (loan.getEsteLibro() == null) {
            System.out.println("No se puede continuar con la operación de prestamo.");
        } else {
            if ((loan.getEsteLibro().isPrestado())) {
                System.out.println("El libro ha sido prestado, debe esperar a que sea devuelto.");
            } else {
                loan.getEsteLibro().setPrestado(true);
                System.out.println("#Ingrese el apellido del lector: ");
                loan.setUnLector((Lector) BuscarElemento.buscarLector(seguidor.nextLine()));
                if (loan.getUnLector() == null) {
                    System.out.println("No se puede continuar con la operación de prestamo.");
                    loan.getEsteLibro().setPrestado(false);
                } else {
                    Date hoy = new Date();
                    System.out.println("#Fecha de salida: ");
                    loan.setFechaSalida(this.fechar(null));
                    System.out.println("#Fecha de regreso: ");
                    loan.setFechaRegreso(this.fechar(loan.getFechaSalida()));
                    ControlEstructuras.almacenarPrestamo(loan);
                }

            }

        }
    }

    /**
     * Método recursivo para evitar el error de ingresar caractéres en lugar de números.
     * Se produce porque el caracter Enter y Espacio son tomados por <code>Scanner</code>.
     * @param in
     * @return entero con formato número de correcto.
     */
    private int leerEnteros(Scanner in) throws ScannerException {
        int entero = 0;
        try {
            entero = in.nextInt();
        } catch (Exception e) {
            System.out.println("Sólo se pueden ingresar números, por favor vuelva a intentarlo.");
            in.nextLine();
            entero = leerEnteros(in);
        }
        return entero;
    }

    /**
     * Establece las fechas para realizar un prestamo, se formatean las fechas usando <code>Date</code>
     * para poder sobre cargar <code>Calendar</code>.
     * @param menor para comparar si la primera ingresada es menor que la segunda.
     * @return Calendar con la fecha establecida.
     */
    private Calendar fechar(Calendar menor) {
        Informante.asustar("Se va a poner una fecha para el tramite solicitado.");
        Calendar hoy = Calendar.getInstance();
        Date today = new Date();
        int año, mes, dia;

        do {
            System.out.println("Ingrese el año: ");
            año = seguidor.nextInt();
            System.out.println("Ingrese el mes: ");
            mes = seguidor.nextInt();
            System.out.println("Ingrese el día: ");
            dia = seguidor.nextInt();
            today.setYear(año);
            today.setMonth(mes);
            today.setDate(dia);
            try {
                hoy.setTime(today);
            } catch (Exception e) {
                Informante.asustar(e + " la fecha explotó");
            }
            if (menor != null && 0 > hoy.compareTo(menor)) {
                System.out.println("@@@@@@las fechas deben ser distintas@@@@@@");
            }
        } while (menor != null && 0 > hoy.compareTo(menor));

        return hoy;
    }
}